SolidJS ๊ณต์ ํด๋ผ์ด์ธํธ ๋ผ์ฐํฐ์ธ Solid Router์ ์ค์น, ์ฌ์ฉ๋ฒ, ๊ณ ๊ธ ๊ธฐ๋ฅ, SPA ๊ตฌ์ถ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๋ ์ข ํฉ ๊ฐ์ด๋์ ๋๋ค.
Solid Router: SolidJS์์ ํด๋ผ์ด์ธํธ ์ธก ๋ด๋น๊ฒ์ด์ ๋ง์คํฐํ๊ธฐ
๋ฐ์ด๋ ์ฑ๋ฅ๊ณผ ๋จ์์ฑ์ผ๋ก ์๋ ค์ง SolidJS๋ ํ๋์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ํ์์ ์ธ ๊ธฐ๋ฐ์ ์ ๊ณตํฉ๋๋ค. ์ง์ ์ผ๋ก ๋งค๋ ฅ์ ์ด๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ๊ฒฝํ์ ๋ง๋ค๊ธฐ ์ํด์๋ ๊ฐ๋ ฅํ ํด๋ผ์ด์ธํธ ์ธก ๋ผ์ฐํฐ๊ฐ ํ์์ ์ ๋๋ค. ๋ฐ๋ก Solid Router๊ฐ ๊ทธ ์ฃผ์ธ๊ณต์ ๋๋ค. SolidJS์ ๊ณต์ ๊ถ์ฅ ๋ผ์ฐํฐ๋ก, ํ๋ ์์ํฌ์ ๋ฐ์์ฑ ์์น๊ณผ ์ํํ๊ฒ ํตํฉ๋๋๋ก ์ค๊ณ๋์์ต๋๋ค.
์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋์์๋ Solid Router์ ์ธ๊ณ๋ฅผ ๊น์ด ํ๊ณ ๋ค์ด, ๊ธฐ๋ณธ ์ค์ ๋ถํฐ ๋ณต์กํ๊ณ ๋์ ์ธ ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA) ๊ตฌ์ถ์ ์ํ ๊ณ ๊ธ ๊ธฐ์ ๊น์ง ๋ชจ๋ ๊ฒ์ ๋ค๋ฃน๋๋ค. ์๋ จ๋ SolidJS ๊ฐ๋ฐ์์ด๋ ์ด์ ๋ง ์์ํ๋ ๋ถ์ด๋ , ์ด ๊ธ์ ํตํด ํด๋ผ์ด์ธํธ ์ธก ๋ด๋น๊ฒ์ด์ ์ ๋ง์คํฐํ๋ ๋ฐ ํ์ํ ์ง์๊ณผ ๊ธฐ์ ์ ๊ฐ์ถ๊ฒ ๋ ๊ฒ์ ๋๋ค.
Solid Router๋ ๋ฌด์์ธ๊ฐ?
Solid Router๋ SolidJS๋ฅผ ์ํด ํน๋ณํ ์ค๊ณ๋ ๊ฐ๋ณ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ํด๋ผ์ด์ธํธ ์ธก ๋ผ์ฐํฐ์ ๋๋ค. SolidJS์ ๋ฐ์์ฑ์ ํ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ URL ๋ณ๊ฒฝ์ ๋ฐ๋ผ UI๋ฅผ ํจ์จ์ ์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค. ๊ฐ์ DOM ๋น๊ต(diffing)์ ์์กดํ๋ ๊ธฐ์กด ๋ผ์ฐํฐ์ ๋ฌ๋ฆฌ, Solid Router๋ DOM์ ์ง์ ์กฐ์ํ์ฌ ๋ ๋น ๋ฅด๊ณ ์์ธก ๊ฐ๋ฅํ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
Solid Router์ ์ฃผ์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ ์ธ์ ๋ผ์ฐํ : ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ธ JSX ๊ธฐ๋ฐ API๋ฅผ ์ฌ์ฉํ์ฌ ๋ผ์ฐํธ๋ฅผ ์ ์ํฉ๋๋ค.
- ๋์ ๋ผ์ฐํ : ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋ผ์ฐํธ๋ฅผ ์ฝ๊ฒ ์ฒ๋ฆฌํ์ฌ ๋์ ์ด๊ณ ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.
- ์ค์ฒฉ ๋ผ์ฐํธ: ์ค์ฒฉ ๋ผ์ฐํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ผ๋ฆฌ์ ์ธ ์น์ ์ผ๋ก ๊ตฌ์ฑํฉ๋๋ค.
- ๋งํฌ ์ปดํฌ๋ํธ: URL ์
๋ฐ์ดํธ์ ํ์ฑ ๋งํฌ ์คํ์ผ๋ง์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋
<A>์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ผ์ฐํธ ๊ฐ์ ์ํํ๊ฒ ์ด๋ํฉ๋๋ค. - ๋ฐ์ดํฐ ๋ก๋ฉ: ๋ผ์ฐํธ๋ฅผ ๋ ๋๋งํ๊ธฐ ์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ์ฌ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
- ํธ๋์ง์ : ๋ผ์ฐํธ ๊ฐ์ ์๊ฐ์ ์ผ๋ก ๋งค๋ ฅ์ ์ธ ํธ๋์ง์ ์ ๋ง๋ค์ด ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํต๋๋ค.
- ์๋ฌ ํธ๋ค๋ง: ์๋ฌ๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ๊ณ ์ฌ์ฉ์ ์ ์ ์๋ฌ ํ์ด์ง๋ฅผ ํ์ํฉ๋๋ค.
- History API ํตํฉ: ๋ธ๋ผ์ฐ์ ์ History API์ ์ํํ๊ฒ ํตํฉ๋์ด ์ฌ์ฉ์๊ฐ ๋ค๋ก ๊ฐ๊ธฐ ๋ฐ ์์ผ๋ก ๊ฐ๊ธฐ ๋ฒํผ์ ์ฌ์ฉํ์ฌ ํ์ํ ์ ์์ต๋๋ค.
Solid Router ์์ํ๊ธฐ
์ค์น
Solid Router๋ฅผ ์ค์นํ๋ ค๋ฉด ์ ํธํ๋ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ์ธ์:
npm install @solidjs/router
yarn add @solidjs/router
pnpm add @solidjs/router
๊ธฐ๋ณธ ์ค์
Solid Router์ ํต์ฌ์ <Router>์ <Route> ์ปดํฌ๋ํธ๋ฅผ ์ค์ฌ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค. <Router> ์ปดํฌ๋ํธ๋ ์ ํ๋ฆฌ์ผ์ด์
๋ผ์ฐํ
์์คํ
์ ๋ฃจํธ ์ญํ ์ ํ๋ฉฐ, <Route> ์ปดํฌ๋ํธ๋ URL๊ณผ ์ปดํฌ๋ํธ ๊ฐ์ ๋งคํ์ ์ ์ํฉ๋๋ค.
๋ค์์ ๊ธฐ๋ณธ ์์ ์ ๋๋ค:
import { Router, Route } from '@solidjs/router';
import Home from './components/Home';
import About from './components/About';
function App() {
return (
<Router>
<Route path="/"> <Home/> </Route>
<Route path="/about"> <About/> </Route>
</Router>
);
}
export default App;
์ด ์์ ์์ <Router> ์ปดํฌ๋ํธ๋ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ์ธ๊ณ ์์ต๋๋ค. <Route> ์ปดํฌ๋ํธ๋ ๋ฃจํธ ๊ฒฝ๋ก("/")์ "/about" ๊ฒฝ๋ก์ ๋ํ ๋ ๊ฐ์ ๋ผ์ฐํธ๋ฅผ ์ ์ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ด ๊ฒฝ๋ก ์ค ํ๋๋ก ์ด๋ํ๋ฉด ํด๋น ์ปดํฌ๋ํธ(Home ๋๋ About)๊ฐ ๋ ๋๋ง๋ฉ๋๋ค.
<A> ์ปดํฌ๋ํธ
๋ผ์ฐํธ ๊ฐ์ ์ด๋ํ๋ ค๋ฉด Solid Router์์ ์ ๊ณตํ๋ <A> ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ธ์. ์ด ์ปดํฌ๋ํธ๋ ์ผ๋ฐ์ ์ธ HTML <a> ํ๊ทธ์ ์ ์ฌํ์ง๋ง, URL ์
๋ฐ์ดํธ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ ์ฒด ํ์ด์ง ์๋ก๊ณ ์นจ์ ๋ฐฉ์งํฉ๋๋ค.
import { A } from '@solidjs/router';
function Navigation() {
return (
<nav>
<A href="/">Home</A>
<A href="/about">About</A>
</nav>
);
}
export default Navigation;
์ฌ์ฉ์๊ฐ ์ด ๋งํฌ ์ค ํ๋๋ฅผ ํด๋ฆญํ๋ฉด, Solid Router๋ ์ ์ฒด ํ์ด์ง ์๋ก๊ณ ์นจ ์์ด ๋ธ๋ผ์ฐ์ ์ URL์ ์ ๋ฐ์ดํธํ๊ณ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํฉ๋๋ค.
๊ณ ๊ธ ๋ผ์ฐํ ๊ธฐ์
๋ผ์ฐํธ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ๋์ ๋ผ์ฐํ
Solid Router๋ ๋์ ๋ผ์ฐํ ์ ์ง์ํ์ฌ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋ผ์ฐํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ ํน์ ID๋ ์ฌ๋ฌ๊ทธ(slug)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฝํ ์ธ ๋ฅผ ํ์ํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
import { Router, Route } from '@solidjs/router';
import UserProfile from './components/UserProfile';
function App() {
return (
<Router>
<Route path="/users/:id"> <UserProfile/> </Route>
</Router>
);
}
export default App;
์ด ์์ ์์ ๊ฒฝ๋ก์ :id ๋ถ๋ถ์ ๋ผ์ฐํธ ๋งค๊ฐ๋ณ์์
๋๋ค. UserProfile ์ปดํฌ๋ํธ ๋ด์์ id ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ ๊ทผํ๋ ค๋ฉด useParams ํ
์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
import { useParams } from '@solidjs/router';
import { createResource } from 'solid-js';
function UserProfile() {
const params = useParams();
const [user] = createResource(() => params.id, fetchUser);
return (
<div>
<h1>User Profile</h1>
{user() ? (
<div>
<p>Name: {user().name}</p>
<p>Email: {user().email}</p>
</div>
) : (<p>Loading...</p>)}
</div>
);
}
async function fetchUser(id: string) {
const response = await fetch(`https://api.example.com/users/${id}`);
return response.json();
}
export default UserProfile;
useParams ํ
์ ๋ผ์ฐํธ ๋งค๊ฐ๋ณ์๋ฅผ ํฌํจํ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ๊ฒฝ์ฐ params.id๋ URL์ id ๋งค๊ฐ๋ณ์ ๊ฐ์ ํฌํจํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ createResource ํ
์ ์ฌ์ฉํ์ฌ ID๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๊ธ๋ก๋ฒ ์์: ๊ธ๋ก๋ฒ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ์์ํด ๋ณด์ธ์. ๋์ ๋ผ์ฐํ
์ ์ฌ์ฉํ์ฌ ์ ํ ID๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ํ์ํ ์ ์์ต๋๋ค: /products/:productId. ์ด๋ฅผ ํตํด ๊ฐ ์ ํ์ ๋ํ ๊ณ ์ ํ URL์ ์ฝ๊ฒ ์์ฑํ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ์๋ ์์น์ ๊ด๊ณ์์ด ํน์ ํญ๋ชฉ์ ๋ ์ฝ๊ฒ ๊ณต์ ํ๊ณ ๋ถ๋งํฌํ ์ ์์ต๋๋ค.
์ค์ฒฉ ๋ผ์ฐํธ
์ค์ฒฉ ๋ผ์ฐํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ผ๋ฆฌ์ ์ธ ์น์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์ด๋ ์ฌ๋ฌ ์์ค์ ๋ด๋น๊ฒ์ด์ ์ด ์๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ ์ ์ฉํฉ๋๋ค.
import { Router, Route } from '@solidjs/router';
import Dashboard from './components/Dashboard';
import Profile from './components/Profile';
import Settings from './components/Settings';
function App() {
return (
<Router>
<Route path="/dashboard">
<Dashboard/>
<Route path="/profile"> <Profile/> </Route>
<Route path="/settings"> <Settings/> </Route>
</Route>
</Router>
);
}
export default App;
์ด ์์ ์์ <Dashboard> ์ปดํฌ๋ํธ๋ <Profile> ๋ฐ <Settings> ์ปดํฌ๋ํธ์ ์ปจํ
์ด๋ ์ญํ ์ ํฉ๋๋ค. <Profile> ๋ฐ <Settings> ๋ผ์ฐํธ๋ <Dashboard> ๋ผ์ฐํธ ๋ด์ ์ค์ฒฉ๋์ด ์์ผ๋ฉฐ, ์ด๋ ์ฌ์ฉ์๊ฐ "/dashboard" ๊ฒฝ๋ก์ ์์ ๋๋ง ๋ ๋๋ง๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
<Dashboard> ์ปดํฌ๋ํธ ๋ด์์ ์ค์ฒฉ๋ ๋ผ์ฐํธ๋ฅผ ๋ ๋๋งํ๋ ค๋ฉด <Outlet> ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค:
import { Outlet } from '@solidjs/router';
function Dashboard() {
return (
<div>
<h1>Dashboard</h1>
<nav>
<A href="/dashboard/profile">Profile</A>
<A href="/dashboard/settings">Settings</A>
</nav>
<Outlet/>
</div>
);
}
export default Dashboard;
<Outlet> ์ปดํฌ๋ํธ๋ ์ค์ฒฉ๋ ๋ผ์ฐํธ๊ฐ ๋ ๋๋ง๋ ์์น๋ฅผ ๋ํ๋ด๋ ํ๋ ์ด์คํ๋ ์ญํ ์ ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ "/dashboard/profile"๋ก ์ด๋ํ๋ฉด <Profile> ์ปดํฌ๋ํธ๊ฐ <Outlet> ์ปดํฌ๋ํธ ๋ด์ ๋ ๋๋ง๋ฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ์ฉ์๊ฐ "/dashboard/settings"๋ก ์ด๋ํ๋ฉด <Settings> ์ปดํฌ๋ํธ๊ฐ <Outlet> ์ปดํฌ๋ํธ ๋ด์ ๋ ๋๋ง๋ฉ๋๋ค.
createResource๋ฅผ ์ฌ์ฉํ ๋ฐ์ดํฐ ๋ก๋ฉ
๋ผ์ฐํธ๋ฅผ ๋ ๋๋งํ๊ธฐ ์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๊ฒ์ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. Solid Router๋ SolidJS์ createResource ํ
๊ณผ ์๋ฒฝํ๊ฒ ํตํฉ๋์ด ๋ฐ์ดํฐ ๋ก๋ฉ์ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
์์ UserProfile ์ปดํฌ๋ํธ์์ ์ด ์์ ๋ฅผ ๋ณด์์ง๋ง, ๋ช ํ์ฑ์ ์ํด ๋ค์ ํ๋ฒ ๋ณด์ฌ๋๋ฆฝ๋๋ค:
import { useParams } from '@solidjs/router';
import { createResource } from 'solid-js';
function UserProfile() {
const params = useParams();
const [user] = createResource(() => params.id, fetchUser);
return (
<div>
<h1>User Profile</h1>
{user() ? (
<div>
<p>Name: {user().name}</p>
<p>Email: {user().email}</p>
</div>
) : (<p>Loading...</p>)}
</div>
);
}
async function fetchUser(id: string) {
const response = await fetch(`https://api.example.com/users/${id}`);
return response.json();
}
export default UserProfile;
createResource ํ
์ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค: ๋ฐ์ดํฐ ๋ก๋ฉ์ ํธ๋ฆฌ๊ฑฐํ๋ ์๊ทธ๋๊ณผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ํจ์์
๋๋ค. ์ด ๊ฒฝ์ฐ ์๊ทธ๋์ () => params.id์ด๋ฉฐ, ์ด๋ id ๋งค๊ฐ๋ณ์๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ฐ์ดํฐ๊ฐ ํ์น๋จ์ ์๋ฏธํฉ๋๋ค. fetchUser ํจ์๋ ID๋ฅผ ๊ธฐ๋ฐ์ผ๋ก API์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
createResource ํ
์ ๋ฆฌ์์ค(๊ฐ์ ธ์จ ๋ฐ์ดํฐ)์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ฐ์ ธ์ค๋ ํจ์๋ฅผ ํฌํจํ๋ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค. ๋ฆฌ์์ค๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ๋ ์๊ทธ๋์
๋๋ค. ์๊ทธ๋(user())์ ํธ์ถํ์ฌ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๊ฐ ์์ง ๋ก๋ฉ ์ค์ด๋ฉด ์๊ทธ๋์ undefined๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ ๋ก๋ฉ ํ์๊ธฐ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
ํธ๋์ง์
๋ผ์ฐํธ ๊ฐ์ ํธ๋์ง์
์ ์ถ๊ฐํ๋ฉด ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. Solid Router์๋ ๋ด์ฅ๋ ํธ๋์ง์
์ง์ ๊ธฐ๋ฅ์ด ์์ง๋ง, solid-transition-group๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ํตํฉ๋์ด ๋ถ๋๋ฝ๊ณ ์๊ฐ์ ์ผ๋ก ๋งค๋ ฅ์ ์ธ ํธ๋์ง์
์ ๊ตฌํํ ์ ์์ต๋๋ค.
๋จผ์ , solid-transition-group ํจํค์ง๋ฅผ ์ค์นํ์ธ์:
npm install solid-transition-group
yarn add solid-transition-group
pnpm add solid-transition-group
๊ทธ๋ฐ ๋ค์, ๋ผ์ฐํธ๋ฅผ <TransitionGroup> ์ปดํฌ๋ํธ๋ก ๊ฐ์ธ์ธ์:
import { Router, Route } from '@solidjs/router';
import { TransitionGroup, Transition } from 'solid-transition-group';
import Home from './components/Home';
import About from './components/About';
function App() {
return (
<Router>
<TransitionGroup>
<Route path="/">
<Transition name="fade" duration={300}>
<Home/>
</Transition>
</Route>
<Route path="/about">
<Transition name="fade" duration={300}>
<About/>
</Transition>
</Route>
</TransitionGroup>
</Router>
);
}
export default App;
์ด ์์ ์์๋ ๊ฐ ๋ผ์ฐํธ๊ฐ <Transition> ์ปดํฌ๋ํธ๋ก ๊ฐ์ธ์ฌ ์์ต๋๋ค. name prop์ ํธ๋์ง์
์ ๋ํ CSS ํด๋์ค ์ ๋์ฌ๋ฅผ ์ง์ ํ๊ณ , duration prop์ ํธ๋์ง์
์ง์ ์๊ฐ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ง์ ํฉ๋๋ค.
์คํ์ผ์ํธ์์ ํธ๋์ง์ ์ ํด๋นํ๋ CSS ํด๋์ค๋ฅผ ์ ์ํด์ผ ํฉ๋๋ค:
.fade-enter {
opacity: 0;
}
.fade-enter-active {
opacity: 1;
transition: opacity 300ms ease-in;
}
.fade-exit {
opacity: 1;
}
.fade-exit-active {
opacity: 0;
transition: opacity 300ms ease-out;
}
์ด CSS ์ฝ๋๋ ๊ฐ๋จํ ํ์ด๋ ์ธ/์์ ํธ๋์ง์
์ ์ ์ํฉ๋๋ค. ๋ผ์ฐํธ์ ์ง์
ํ๋ฉด .fade-enter ๋ฐ .fade-enter-active ํด๋์ค๊ฐ ์ ์ฉ๋์ด ์ปดํฌ๋ํธ๊ฐ ํ์ด๋ ์ธ๋ฉ๋๋ค. ๋ผ์ฐํธ์์ ๋ฒ์ด๋๋ฉด .fade-exit ๋ฐ .fade-exit-active ํด๋์ค๊ฐ ์ ์ฉ๋์ด ์ปดํฌ๋ํธ๊ฐ ํ์ด๋ ์์๋ฉ๋๋ค.
์๋ฌ ํธ๋ค๋ง
์๋ฌ๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ํ์์ ์ ๋๋ค. Solid Router์๋ ๋ด์ฅ๋ ์๋ฌ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ด ์์ง๋ง, ์ ์ญ ์๋ฌ ๋ฐ์ด๋๋ฆฌ๋ ๋ผ์ฐํธ๋ณ ์๋ฌ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
๋ค์์ ์ ์ญ ์๋ฌ ๋ฐ์ด๋๋ฆฌ์ ์์ ๋๋ค:
import { createSignal, Suspense, ErrorBoundary } from 'solid-js';
import { Router, Route } from '@solidjs/router';
import Home from './components/Home';
import About from './components/About';
function App() {
const [error, setError] = createSignal(null);
return (
<ErrorBoundary fallback={<p>Something went wrong: {error()?.message}</p>}>
<Suspense fallback={<p>Loading...</p>}>
<Router>
<Route path="/"> <Home/> </Route>
<Route path="/about"> <About/> </Route>
</Router>
</Suspense>
</ErrorBoundary>
);
}
export default App;
<ErrorBoundary> ์ปดํฌ๋ํธ๋ ์์ ์ปดํฌ๋ํธ ๋ด์์ ๋ฐ์ํ๋ ๋ชจ๋ ์๋ฌ๋ฅผ ํฌ์ฐฉํฉ๋๋ค. fallback prop์ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ๋ ๋๋งํ ์ปดํฌ๋ํธ๋ฅผ ์ง์ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์๋ฌ ๋ฉ์์ง๊ฐ ํฌํจ๋ ๋จ๋ฝ์ ๋ ๋๋งํฉ๋๋ค.
<Suspense> ์ปดํฌ๋ํธ๋ ๋ณด๋ฅ ์ค์ธ ํ๋ก๋ฏธ์ค๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ๋น๋๊ธฐ ์ปดํฌ๋ํธ๋ ๋ฐ์ดํฐ ๋ก๋ฉ๊ณผ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. ํ๋ก๋ฏธ์ค๊ฐ ํด๊ฒฐ๋ ๋๊น์ง `fallback` prop์ ํ์ํฉ๋๋ค.
์๋ฌ๋ฅผ ๋ฐ์์ํค๋ ค๋ฉด ์ปดํฌ๋ํธ ๋ด์์ ์์ธ๋ฅผ ๋์ง ์ ์์ต๋๋ค:
function Home() {
throw new Error('Failed to load home page');
return <h1>Home</h1>;
}
export default Home;
์ด ์ฝ๋๊ฐ ์คํ๋๋ฉด <ErrorBoundary> ์ปดํฌ๋ํธ๊ฐ ์๋ฌ๋ฅผ ํฌ์ฐฉํ๊ณ fallback ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํฉ๋๋ค.
๊ตญ์ ํ ๊ณ ๋ ค์ฌํญ: ์๋ฌ ๋ฉ์์ง๋ฅผ ํ์ํ ๋ ๊ตญ์ ํ(i18n)๋ฅผ ๊ณ ๋ คํ์ธ์. ๋ฒ์ญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ ํธํ๋ ์ธ์ด๋ก ์๋ฌ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ์ธ์. ์๋ฅผ ๋ค์ด, ์ผ๋ณธ ์ฌ์ฉ์๊ฐ ์๋ฌ๋ฅผ ๋ง์ฃผ์ณค์ ๋ ์์ด ๋์ ์ผ๋ณธ์ด๋ก ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ณด์์ผ ํฉ๋๋ค.
Solid Router ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ๋ผ์ฐํธ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ์ธ์: ์ค์ฒฉ ๋ผ์ฐํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ผ๋ฆฌ์ ์ธ ์น์ ์ผ๋ก ๊ตฌ์ฑํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๋ฅผ ์ ์ง ๊ด๋ฆฌํ๊ณ ํ์ํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.
- ๋์ ์ฝํ ์ธ ์ ๋ผ์ฐํธ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ธ์: ๋ผ์ฐํธ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ID๋ ์ฌ๋ฌ๊ทธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฝํ ์ธ ๋ฅผ ํ์ํ๋ ๋์ URL์ ๋ง๋์ธ์.
- ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ์ธ์: ๋ผ์ฐํธ๋ฅผ ๋ ๋๋งํ๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ์ฌ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ์ธ์.
- ๋ผ์ฐํธ ๊ฐ์ ํธ๋์ง์ ์ ์ถ๊ฐํ์ธ์: ํธ๋์ง์ ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ธ๋ จ๋๊ฒ ๋ง๋์ธ์.
- ์๋ฌ๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ์ธ์: ์๋ฌ ํธ๋ค๋ง์ ๊ตฌํํ์ฌ ์ฌ์ฉ์ ์นํ์ ์ธ ๋ฐฉ์์ผ๋ก ์๋ฌ๋ฅผ ํฌ์ฐฉํ๊ณ ํ์ํ์ธ์.
- ์ค๋ช ์ ์ธ ๋ผ์ฐํธ ์ด๋ฆ์ ์ฌ์ฉํ์ธ์: ๋ผ์ฐํธ์ ๋ด์ฉ์ ์ ํํ๊ฒ ๋ฐ์ํ๋ ๋ผ์ฐํธ ์ด๋ฆ์ ์ ํํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์กฐ๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.
- ๋ผ์ฐํธ๋ฅผ ํ ์คํธํ์ธ์: ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ์ฌ ๋ผ์ฐํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ์ธ์. ์ด๋ ์๋ฌ๋ฅผ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํ๊ณ ํ๊ท๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๊ฒฐ๋ก
Solid Router๋ SolidJS์ ์๋ฒฝํ๊ฒ ํตํฉ๋๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ํด๋ผ์ด์ธํธ ์ธก ๋ผ์ฐํฐ์ ๋๋ค. ๊ทธ ๊ธฐ๋ฅ๋ค์ ๋ง์คํฐํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด, ๋ถ๋๋ฝ๊ณ ๋งค๋ ฅ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ณต์กํ๊ณ ๋์ ์ธ ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ ์ค์ ๋ถํฐ ๋์ ๋ผ์ฐํ , ๋ฐ์ดํฐ ๋ก๋ฉ, ํธ๋์ง์ ๊ณผ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ์ ์ ์ด๋ฅด๊ธฐ๊น์ง, ์ด ๊ฐ์ด๋๋ SolidJS์์ ํด๋ผ์ด์ธํธ ์ธก ๋ด๋น๊ฒ์ด์ ์ ์ธ๊ณ๋ฅผ ์์ ๊ฐ ์๊ฒ ํ์ํ ์ ์๋ ์ง์๊ณผ ๊ธฐ์ ์ ์ ๊ณตํ์ต๋๋ค. Solid Router์ ํ์ ๋ฐ์๋ค์ฌ SolidJS ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ๋ฐํํ์ธ์!
๊ฐ์ฅ ์ต์ ์ ๋ณด์ ์์ ๋ ๊ณต์ Solid Router ๋ฌธ์๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ ์์ง ๋ง์ธ์: [Solid Router ๋ฌธ์ ๋งํฌ - ํ๋ ์ด์คํ๋]
SolidJS๋ก ๊ณ์ํด์ ๋ฉ์ง ๊ฒ๋ค์ ๋ง๋ค์ด ๋๊ฐ์ธ์!